package com.forum.module.blog.service.tag;

import com.alibaba.nacos.shaded.com.google.common.annotations.VisibleForTesting;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.forum.framework.common.exception.util.ServiceExceptionUtils;
import com.forum.framework.common.pojo.PageResult;
import com.forum.framework.common.util.object.BeanUtils;
import com.forum.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.forum.module.blog.controller.tag.vo.TagPageReqVO;
import com.forum.module.blog.controller.tag.vo.TagSavaReqVO;
import com.forum.module.blog.dal.dataobject.notification.NotificationDO;
import com.forum.module.blog.dal.dataobject.tag.TagDO;
import com.forum.module.blog.dal.mysql.tag.TagMapper;
import org.springframework.stereotype.Service;

import static com.forum.module.system.enums.ErrorCodeConstants.*;

/**
 * 功能:
 * 作者:ouyzh
 * 日期:2025/3/2 18:35
 */
@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, TagDO> implements TagService {
    private final TagMapper tagMapper;

    public TagServiceImpl(TagMapper tagMapper) {
        this.tagMapper = tagMapper;
    }

    @Override
    public Long createTag(TagSavaReqVO reqVO) {
        validUnique(reqVO);
        TagDO tagDO = BeanUtils.toBean(reqVO, TagDO.class);
        tagMapper.insert(tagDO);
        return tagDO.getId();
    }

    @Override
    public void updateTag(TagSavaReqVO reqVO) {
        validUnique(reqVO);
        TagDO updateObj = BeanUtils.toBean(reqVO, TagDO.class);
        tagMapper.updateById(updateObj);
    }

    private void validUnique(TagSavaReqVO reqVO) {
        if (tagMapper.exists(new LambdaQueryWrapperX<TagDO>().eqIfPresent(TagDO::getName, reqVO.getName()))) {
            throw ServiceExceptionUtils.exception(TAG_IS_EXISTS);
        }
    }

    @Override
    public void deleteById(Long id) {
        // 1. 校验标签存在
        validateTagExists(id);

        tagMapper.deleteById(id);
    }

    @VisibleForTesting
    TagDO validateTagExists(Long id) {
        if (id == null) {
            return null;
        }
        TagDO tagDO = tagMapper.selectById(id);
        if (tagDO == null) {
            throw ServiceExceptionUtils.exception(TAG_NOT_EXISTS);
        }
        return tagDO;
    }

    @Override
    public PageResult<TagDO> getTagPage(TagPageReqVO pageReqVO) {
        return tagMapper.selectPage(pageReqVO);
    }
}
